Fork me on GitHub

Java集合框架 - ArrayList与源码分析

注意:所有文章除特别说明外,转载请注明出处.

Java集合框架 - ArrayList与源码分析

//ArrayList继承关系
java.lang.Object
   ↳     java.util.AbstractCollection<E>
         ↳     java.util.AbstractList<E>
               ↳     java.util.ArrayList<E>

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

ArrayList继承了AbstractList,实现了List。它是一个数组队列,相当于动态数组。提供了相关的添加、删除、修改和遍历等功能。

ArrayList

ArrayList实现了RandomAccess接口,即提供了随机访问功能。RandomAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号来快速获取元素对象,这就是快速随机访问。后面会比较List的“快速随机访问”和使用“Iterator迭代器访问”的效率。

ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

ArrayList实现了java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

注意:和Vector不同,ArrayList中的操作是非线程安全的。所以建议在单线程中使用ArrayList,在多线程中选择Vector或者CopyOnWriteArrayList。

提示:1. ArrayList是基于动态数组实现的,在增删时候,需要数组的拷贝复制。

  1. ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍。
  2. 删除元素时不会减少容量,若希望减少容量则调用trimToSize()。
  3. 它不是线程安全的。它能存放null值。

ArrayList 与 Vector 区别

Vector底层也是数组,与ArrayList最大的区别就是:同步(线程安全)。

在要求非同步的情况下,我们一般都是使用ArrayList来替代Vector的。

如果想要ArrayList实现同步,可以使用Collections的方法:

List list = Collections.synchronizedList(new ArrayList(...));

就可以实现同步了。

还有另外的一个区别:ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector扩展1倍。

LinkedList 解析

LinkedList底层是双向链表,

本文标题:Java集合框架 - ArrayList与源码分析

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:12:21

原始链接:http://bangjinhu.github.io/undefined/Java容器框架 - List集合与源码分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.